home *** CD-ROM | disk | FTP | other *** search
- /*
- * Example of a more reliable echo client using UDP protocol.
- */
-
- #include "rudp.h"
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int sockfd;
-
- pname = argv[0];
-
- if ( (sockfd = udp_open(HOST, MYECHO_SERVICE, 0, 0)) < 0)
- err_sys("udp_open error");
-
- doit(stdin, sockfd); /* do it all */
-
- exit(0);
- }
-
- /*
- * Read the contents of the FILE *fp, write each line to the
- * socket (to the server process), then read a line back from
- * the socket and print it on the standard output.
- */
-
- doit(fp, sockfd)
- register FILE *fp;
- register int sockfd;
- {
- int n, sendlen;
- long seqsend;
- char sendline[MAXLINE], recvline[MAXLINE];
-
- seqsend = 0; /* initialize sequence number to send */
- while (fgets(sendline + sizeof(long), MAXLINE, fp) != NULL) {
- seqsend++; /* increment sequence number */
- bcopy((char *) &seqsend, sendline, sizeof(long));
- sendlen = strlen(sendline + sizeof(long)) + sizeof(long);
- rexmit:
- if ( (n = dgsendrecv(sockfd, sendline, sendlen, recvline,
- MAXLINE,
- (struct sockaddr *) 0, 0)) < 0) {
- if (errno == EINTR)
- err_sys("client: no response from server");
- else
- err_dump("client: dgsendrecv error");
- }
-
- if (bcmp((char *) &seqsend, recvline, sizeof(long)) != 0) {
- err_ret("incorrect sequence# received");
- goto rexmit;
- }
-
- recvline[n] = 0; /* null terminate */
- fputs(recvline + sizeof(long), stdout);
- }
-
- if (ferror(fp))
- err_dump("client: error reading file");
- }
-